﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Inventario_HardSoft.ADO;
using System.Windows.Forms;
using System.Data;

namespace Inventario_HardSoft.Controlador
{
    class Ctrl_Proyecto
    {
        ConexionDataContext conexion;
        Contador conta;

        public Ctrl_Proyecto()
        {
            conexion = new ConexionDataContext();
            conta = new Contador(); 
        }

        internal List<PROYECTO> getList_Proyectos()
        {  
            List<PROYECTO> listProy = conexion.PROYECTO.Where(x => x.ESTADO=="Ejecucion").ToList<PROYECTO>();
            return listProy;
        }

        internal List<PROYECTO> getList_ProyectosEjecutandoseFinalizado()
        {
            List<PROYECTO> listProy = conexion.PROYECTO.ToList<PROYECTO>();
            return listProy;
        }

        internal void Proyectos(DataGridView dgSw, string p)
        {
            int i = 1;

            var consulta = from proyec in conexion.PROYECTO
                           join user in conexion.USUARIO on proyec.IDUSUARIO equals user.IDUSUARIO
                           join acti in conexion.ACTIVIDAD on proyec.IDPROYECTO equals acti.IDPROYECTO into tempActividad
                           from actividades in tempActividad.DefaultIfEmpty()
                           where (proyec.NOMBPROYECTO == p)
                           select new
                           {
                               proyec.IDPROYECTO,
                               proyec.NOMBPROYECTO,
                               user.NOMBRE,
                               proyec.FECHAINICIO,
                               proyec.FECHAESTIMADATERMINO,
                               proyec.COSTO,
                               proyec.OBJETIVO,
                               proyec.ESTADO,
                               actividades.IDACTIVIDAD,
                               actividades.FECHAESTIMADAACTIVIDAD,
                               actividades.OBSERVACION,
                               actividades.FECHADECONSULTA
                           };

            foreach (var c in consulta)
            {
                object[] obj = new object[] {  
                                                c.IDPROYECTO,i,c.NOMBRE,c.NOMBPROYECTO,c.ESTADO,
                                                c.COSTO,c.OBJETIVO,
                                                c.FECHAINICIO.GetValueOrDefault(DateTime.MinValue),
                                                c.FECHAESTIMADATERMINO.GetValueOrDefault(DateTime.MinValue),                                              
                                                c.IDACTIVIDAD, c.FECHAESTIMADAACTIVIDAD.GetValueOrDefault(DateTime.MinValue), 
                                                c.OBSERVACION,
                                                c.FECHADECONSULTA.GetValueOrDefault(DateTime.MinValue)
                                             };

                obj[7] = ((DateTime)obj[7]).Equals(DateTime.MinValue) ? String.Empty : ((DateTime)obj[7]).ToShortDateString();
                obj[8] = ((DateTime)obj[8]).Equals(DateTime.MinValue) ? String.Empty : ((DateTime)obj[8]).ToShortDateString();
                obj[10] = ((DateTime)obj[10]).Equals(DateTime.MinValue) ? String.Empty : ((DateTime)obj[10]).ToShortDateString();
                obj[12] = ((DateTime)obj[12]).Equals(DateTime.MinValue) ? String.Empty : ((DateTime)obj[12]).ToShortDateString();
                //grid_Proyect.Rows.Add(obj);
                dgSw.Rows.Add(obj);
                i++;
                i++;
            }           
        }

        internal DataTable getProyecto(string proy)
        {
            DataTable dt = new DataTable();

            try
            {
                var query = conexion.PROYECTO.Join(conexion.USUARIO, p => p.IDUSUARIO, u => u.IDUSUARIO,
                       (p, u) => new
                       {
                           p.IDPROYECTO,
                           p.NOMBPROYECTO,
                           p.FECHAINICIO,
                           p.OBJETIVO,
                           p.FECHAESTIMADATERMINO,
                           p.ESTADO,
                           p.COSTO,
                           u.NOMBRE
                       }
                       ).Single(x => x.NOMBPROYECTO == proy);

                dt.Columns.Add(new DataColumn("idproyecto", typeof(string)));
                dt.Columns.Add(new DataColumn("nombreproyecto", typeof(string)));
                dt.Columns.Add(new DataColumn("fechainicio", typeof(string)));
                dt.Columns.Add(new DataColumn("objetivo", typeof(string)));
                dt.Columns.Add(new DataColumn("fechaestimadatermino", typeof(string)));
                dt.Columns.Add(new DataColumn("estado", typeof(string)));
                dt.Columns.Add(new DataColumn("costo", typeof(string)));
                dt.Columns.Add(new DataColumn("nombretercero", typeof(string)));

                DataRow dr = dt.NewRow();

                dr["idproyecto"] = query.IDPROYECTO;
                dr["nombreproyecto"] = query.NOMBPROYECTO;
                dr["fechainicio"] = query.FECHAINICIO.GetValueOrDefault(DateTime.MinValue).Equals(DateTime.MinValue) ? String.Empty: query.FECHAINICIO.Value.ToShortDateString();
                dr["objetivo"] = query.OBJETIVO;
                dr["fechaestimadatermino"] = query.FECHAESTIMADATERMINO.GetValueOrDefault(DateTime.MinValue).Equals(DateTime.MinValue) ? string.Empty: query.FECHAINICIO.Value.ToShortDateString();
                dr["estado"] = query.ESTADO;
                dr["costo"] = query.COSTO;
                dr["nombretercero"] = query.NOMBRE;

                dt.Rows.Add(dr);
            }
            catch (ArgumentNullException)
            {                
                throw new ArgumentNullException();
            }

            return dt;
        }

        internal List<ACTIVIDAD> getListActividad(string idproy)
        {
            return conexion.ACTIVIDAD.Where(x => x.IDPROYECTO == idproy && x.ELIMINADO == 0).ToList<ACTIVIDAD>();
        } 

        internal void actualizaActividad(string idproy, DateTime fRealTermino, string observacion,DateTime fConsulta)
        { 
            ACTIVIDAD act;
            var consulta2 = from proyec in conexion.PROYECTO
                            join user in conexion.USUARIO on proyec.IDUSUARIO equals user.IDUSUARIO
                            join acti in conexion.ACTIVIDAD on proyec.IDPROYECTO equals acti.IDPROYECTO into tempActividad
                            from actividades in tempActividad.DefaultIfEmpty()
                            where (proyec.IDPROYECTO == idproy)
                            select proyec ;
            //int idproyec = Convert.ToInt32(conexion.INVENTARIO_CONTADOR.Single(x => x.IDENTIFICADOR == "HARDSOFT").CONT_IDACTIVIDAD);
            //String idproyec = consulta2.Single().IDPROYECTO; 
            String numero = Convert.ToString(conta.getNumContador_IdActividad());
            String numero2 = numero.Trim().PadLeft(7, '0');
            String idActiv = "ACT_" + numero2;

            act = new ACTIVIDAD
            {
            IDPROYECTO = idproy,
            IDACTIVIDAD = idActiv,
            FECHAESTIMADAACTIVIDAD = fRealTermino,
            OBSERVACION =  observacion,
            FECHADECONSULTA = fConsulta,         
            };
             
            conexion.ACTIVIDAD.InsertOnSubmit(act);
            conexion.SubmitChanges();
            conexion.increm_ContadorIdActividad(); 

        }

        internal bool agregarActividad(ACTIVIDAD a)
        {
            try
            {
                String numero = Convert.ToString(conta.getNumContador_IdActividad());
                String numero2 = numero.Trim().PadLeft(7, '0');
                String idActiv = "ACT_" + numero2;

                a.IDACTIVIDAD = idActiv;

                conexion.ACTIVIDAD.InsertOnSubmit(a);
                conexion.SubmitChanges();
                conexion.increm_ContadorIdActividad();

                return true;
            }
            catch (Exception e)
            {
                throw e.InnerException;
            }
        }

        internal bool contieneActividad(string observ, string idpr)
        {
            bool result = false;

            List<ACTIVIDAD> activ = this.getListActividad(idpr);

            foreach (ACTIVIDAD a in activ)
            {
                if (string.Equals(a.OBSERVACION,observ,StringComparison.CurrentCultureIgnoreCase))
                {
                    result = true;
                    break;
                }
                else
                {
                    result = false;
                }
            }

            return result;
        }

        internal bool actualizaActividad(ACTIVIDAD act)
        {
            bool result = false;

            try
            {
                ACTIVIDAD actividad = conexion.ACTIVIDAD.Single(x => x.IDACTIVIDAD == act.IDACTIVIDAD);

                actividad.FECHADECONSULTA = act.FECHADECONSULTA;
                actividad.OBSERVACION = act.OBSERVACION;
                actividad.FECHAESTIMADAACTIVIDAD = act.FECHAESTIMADAACTIVIDAD;

                conexion.SubmitChanges();
                result = true;
            }
            catch (ArgumentNullException)
            {                
                throw new ArgumentNullException();
            }

            return result;
        }

        internal bool eliminarActividad(string idactividad)
        {
            bool result = false;
            try
            {
                ACTIVIDAD actividad = conexion.ACTIVIDAD.Single(x => x.IDACTIVIDAD == idactividad);
                actividad.ELIMINADO = 1;                
                conexion.SubmitChanges();
                result = true;
            }
            catch (ArgumentNullException)
            {
                throw new ArgumentNullException();
            }

            return result;
        } 

        internal bool finalizaProyecto(string idProy, string idActi)
        {
            bool result = false;

            try
            {
                PROYECTO proyecto = conexion.PROYECTO.Single(x => x.IDPROYECTO == idProy);
                proyecto.ESTADO = "Finalizado";

                ACTIVIDAD actividad = conexion.ACTIVIDAD.Single(x => x.IDACTIVIDAD == idActi && x.ELIMINADO == 0);
                actividad.ESTADO = "Cierre";

                conexion.SubmitChanges();
                result = true;
            }
            catch(ArgumentNullException) 
            {
                throw new ArgumentNullException();
            }

            return result;
        }
    }     
}

